package tg.game;

/**
 * 玩法逻辑接口 
 * @author T410
 * 公用玩法：单双、大小、独中、组合中，排列中
 * 私有玩法：
 *     小        球 ：  生肖（指定每个生肖的码号）、过关
 *     快乐十分 ：  前N任选/ 选N前直....  
 * 
 * 
 * 玩法作用：
 *    判断本玩法的码号是否合法
 *    根据游戏结果，算出玩法结果
 *    根据玩法结果，判断下注码号是否中奖
 *    根据游戏结果，取得本玩法所有中奖码号（一般一个玩法只有一个中奖码号，但是也有可能多个）
 *    
 *    根据json初始化本类
 * 玩法的理解：
 *    玩法是根据游戏结果，用一种规则 来计算输赢的，它规定了本规则下所有的本玩法的码号，这组码号范围可以拿来下注
 *    在游戏结束之后根据玩法码号用玩法规则来计算下注的码号是否中奖
 *    之前的子玩法是因为一个玩法的规则中，有多种不同概率的码号，需要再定义多个子玩法，这些子玩法的码号 
 *    
 *    玩法规定 一种 计算输赢的规则 它所有的码号总的概率是100%
 *    玩法也规定一组可供玩家下注的码号，这些码号的中奖概率加起来是100%
 *    如果同一个玩法多个码号中有多种赔率的多组码号的话，一般是把这些码号拆出来，定义成子玩法
 *    所以子玩法也是规定一组固定概率的码号，一个主玩法会有多个不同概率的子玩法
 *    创建实例时需要设定这些不同子玩法的不同的赔率，主玩法主要是拿来结算，根据游戏结果计算出哪个码号中奖的，这些码号中奖赔率是所属不同的子玩法规定的，因为概率不同
 *    子玩法最主要是为了一个玩法中有多组不同概率的码号来规定的，一种概率规定一个子玩法，一个赔率，一组本概率下的码号，规则是用主玩法的
 *    
 *    主玩法（实例后需要的具体参数值）：
 *       中奖规则
 *       码号范围或码号枚举
 *       赔率
 *    子玩法（中奖规则是用主玩法的，它只规定本组码号和不同概率下的赔率）    	 
 *       码号范围或码号枚举
 *       赔率
 *    可以有个带子玩法的主玩法类或接口
 *    可以弄个子玩法类或接口，所有的动作就是要多一层
 *    子玩法的注单要不要到主玩法去？
 *    分类报时，是不是以子玩法来分类？还是以主玩法分类？
 *    缓存和逻辑分开，缓存也是要分多个类的，可以是继承关系，  逻辑用接口方式
 *    玩法不同的逻辑有 
 *    	 1. 计算玩法码号中奖逻辑 
 *       2.取赔率逻辑（赔率是字符串，有些是单个赔率，有些是多个赔率要从多个码中取得）
 *       3.取得本级操盘值、下注操盘值（下注要用上级的赔率）
 *         赔率是上级给我的，操盘时变动操盘值是给下级的，所以赔率取法应该是【本级的赔率】 + 【所有上级的操盘值和】
 *         会员身上的操盘值如何是好？因为只有代理才有操盘，所以会员是取【会员赔率】+【所有上级代理操盘和】是对的，这样操盘只能本级操盘，如果要让
 *         下级自动降倍，只能关闭下级的自动降倍功能，让上级可对下级来设定自动降倍，会员是无法自动降倍的，最低级只能到代理上面，所以
 *         只能代理对他的所有会员自动降，无法单个会员自己降
 *         只能代理对所有会员自动降倍，无法单个会员自己降倍
 *         
 * 玩法的设定：
 *   玩法的设定用绑定的方式，比如当前创建一个玩法实例，在参数中要选择绑定的玩法设定
 *   
 * 
 * 
 * 玩法   只用来设定退水 ，同时绑定玩法基类，需要设定玩法类型：
 * 	   单一赔率普通玩法， 多赔率码号范围普通玩法，   多赔率奖项普通玩法，     组合下注普通玩法  ， 组合下注取最小赔率普通玩法，  组合下注取平均赔率玩法，过关玩法
 *   码号范围  用来设定赔率   多个码号范围赔率的下注码号，
 *   中奖项      用来设定赔率   多中奖项，就是多中奖赔率像三中二这种
 */
public interface IGamePlayLogic {
	/**
	 * 根据json来初始化本类
	 * @param json
	 */
	public void iniJson(String json);
	/**
	 * 检测码号是否合法
	 * @param mh
	 * @return
	 */
	public boolean checkMh(String mh);
	/**
	 * 根据游戏结果，算出玩法结果
	 * @param gameResult
	 * @return
	 * 比如游戏结果是 1， 2， 3
	 * 基础：  第一位的单双是 单
	 * 复合：  总和的单双是 双
	 * 
	 * 单双玩法中要有属性：玩法 计算范围： 单个、多个的和、多个的积、
	 * 
	 */
	public IGamePlayResult caculateGpResult(IGameResult gameResult);
	/**
	 * 结算注单
	 * @param bet
	 * 不同的结算逻辑自己去实现
	 * 可以统一写一种，如果有特殊的再自己实现
	 */
	public void countBet(IGameBet bet);
	
	/**
	 * 根据玩法结果，计算出码号的中奖，主要是给长龙用的，计算码号是否中奖
	 * @return
	 */
	public int getWinFlag(IGamePlayResult gpResult,String mh);
	/**
	 * 获取下注赔率（上级的赔率，我是会员，是上级给我的赔率）
	 * 根据玩法、码号和当前操盘信息（码号缓存里面得到所有的信息），得到下注赔率
	 * @return
	 * 本级的下注赔率 = 本级的赔率设定（上级设定给我的） + 所有上级操盘和（不包含本级操盘值）
	 * 最小赔率：从本码号的缓存中，取得其他的码号缓存，得到其他码号的赔率，找到最小值
	 * 平均赔率：取得所有码号的值，最后求平均
	 * 过关赔率：把所有的过关码号赔率串起来
	 */
	public String getBetPeilv();
	/**
	 * 获取操盘赔率[可能不需要了，因为只要能另外取得本级的操盘 值，操盘赔率就是 下注赔率 + 本级操盘]
	 * 操盘赔率是本级的赔率
	 * @return
	 * 不同的玩法有不同的逻辑
	 * 操盘赔率 = 下注赔率 + 本级操盘值 
	 */
	public String getCaopanPeilv();
}
